#include <float.h> void _fpreset(); переинициализирует математический пакет с плавающей точкой.
Описание:
Функция _fpreset переинициализирует математический пакет сплавающей точкой. Эта функция обычно используется с процедурами signal , system или с семейством процедур exec , spawn.
Если программа вместе с функцией signal захватывает сигналы ошибок с плавающей точкой (SIGFPE ), то она при вызове _fpreset благополучно восстанавливается из ошибок с плавающей точкой и выполняет longjmp.
Замечание!
В версиях MS DOS , более ранних чем 4.0, child -процесс, выполнимый в exec, spawn или system , может воздействовать на состояние с плавающей точкой parent-процесса, если используется 8087 или 80287 сопроцессор. Поэтому, если используется сопроцессор 8087 либо 80287 , рекомендуются помнить, что:
* exec, spawn, system не могут вызываться в процессе вычисления выражения с плавающей точкой;
* _fpreset должна быть вызвана после этих процедур, если child -процесс может выполнить требуемую операцию.
Пример.
#include <stdio.h> #include <signal.h> #include <setjmp.h> #include <float.h> int fphandler (); jmp_buf mark; double a = 1.0, b = 0.0, c; main() { if(signal(SIGFPE, fphandler)==(int(*)())-1) abort(); if(setjmp(mark)==0) { c = a/b; printf("Should never get here\n"); } printf("Recovered from floating-point error\n"); } int fphandler(sig,num) int sig,num; { printf("signal=%d subcode =%d\n",sig,num); _fpreset(); /* переинициализирует пакет с плавающей точкой */ longjmp(mark,-1); }